#pragma once
#include "Astronomy/Coordinate.hpp"

//
// 计算太阳黄经赤纬所需类型变量
struct VSOP87Coefficient
{
    double A;
    double B;
    double C;
};

class CelestialEarth
{
public:
    /**
     * @brief [E_v]地球速度计算
     *
     * @param T
     *        儒略世纪数;
     * @return double
     */
    static double Velocity(const double T) noexcept;
    /*
     * @brief [E_Lon] 计算地心黄道经度;
     *
     * @param T
     *        儒略世纪数;
     *
     * @param CalcItemsCount
     *        参与计算数量 默认：-1 全部参与计算;
     *
     * @return 地球黄经(单位：度);
     */
    static double EclipticLongitude(double T, int CalcItemsCount = -1) noexcept;
    /*
     * @brief 计算地心黄道纬度;
     *
     * @param T
     *        儒略世纪数;
     *
     * @param CalcItemsCount
     *        参与计算数量 默认：-1 全部参与计算;
     *
     * @return 地球黄纬度(单位：度);
     */
    static double EclipticLatitude(double T, int CalcItemsCount = -1) noexcept;

    /*
     * @brief 计算地球偏心率;
     *
     * @param T
     *        儒略世纪数;
     * @return 地球偏心率(E);
     */
    static double Eccentricity(const double T) noexcept
    {
        const double Tsquared{T * T};
        return 1 - (0.002516 * T) - (0.0000074 * Tsquared);
    };
    /*
     * @brief 计算地球半径矢量;
     *
     * @param T
     *        儒略世纪数;
     *
     * @param CalcItemsCount
     *        参与计算数量 默认：-1 全部参与计算;
     *
     * @return 半径矢量(单位：);
     */
    static double RadiusVector(double T, int CalcItemsCount = -1) noexcept;

    /**
     * @brief 计算当前地球坐标;
     *
     * @param T
     *           T儒略世纪数;
     * @param numberOfL
     *           经度数据参与计算数量;
     * @param numberOfB
     *           纬度数据参与计算数量;
     * @param numberOfR
     *           间距数据参与计算数量;
     * @return Coordinate3D 坐标系统;
     */
    static Coordinate3D Coordinate(double T, int numberOfL, int numberOfB, int numberOfR) noexcept;

    /**
     * @brief [E_Lon_t] 已知地球真黄经求时间
     * 
     * @param W 
     *        地球真黄经值;
     * @return double 
     */
    double GetEclipticLongitudeTime(double W) noexcept;

private:
    /**
     * @brief 计算地球数据项;
     *
     * @param T
     *           儒略世纪数;
     * @param coff
     *           数据集指针;
     * @param count
     *           数据大小;
     * @param CalcItemsCount
     *           允许参与计算的数据大小（大于0 有效，反之数据集全部数据参与计算）;
     * @return double 结果;
     */
    static double CalcPeriodicTerm(const double T, const VSOP87Coefficient *coff, size_t count, int CalcItemsCount = 0) noexcept;
};
;
